/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.manager;

import com.brain.comp.dto.SistemaControlCompDetaDto;
import com.brain.comp.dto.SistemaControlCompDto;
import com.brain.comp.mbean.ComprobanteCompraMBean;
import com.brain.comp.mbean.DocumentoCompraMBean;
import com.brain.comp.mbean.PedidoCompraMBean;
import com.brain.comp.mbean.SolicitudCompraMBean;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class SistemaControlCompManager extends ComunManager<SistemaControlCompDto> implements Serializable {

    private static Logger logger = Logger.getLogger(SistemaControlCompManager.class);
    private Long idEntidad = 264L;
    @Resource
    private DAOGenerico<SistemaControlCompDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private SistemaControlCompDetaManager detaManager;
    @Resource
    private ApplicationMBean applicationMBean;
    private final String url = "/pages/comp/sistemaControl/sistemaControl.xhtml";
    private final String urlLista = "/pages/comp/sistemaControl/listaSistemasControl.xhtml";

    /**
     * obtener Sistema de Control por Id
     *
     * @param id
     * @return Sistema de Control
     * @throws DAOException
     */
    public SistemaControlCompDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(SistemaControlCompDto.class, id);
    }

    /**
     * Metodo para obtener Sistema de Control segun filtro
     *
     * @param dtoFiltro
     * @return Lista de Sistema de Control
     * @throws DAOException
     */
    public List<SistemaControlCompDto> obtenerPorEmpresa() throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from SistemaControlCompDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " order by e.transaccion  asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo para editar Documentos de Compra
     *
     * @param dto Documento de Compra
     * @return cadena de satisfaccion
     */
    public String guardar(SistemaControlCompDto dto, List<SistemaControlCompDetaDto> lstDetalles) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        try {
            //if (dto.getOrganizacionDto() != null) {

            {
                dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setTerminal(sessionMBean.getSessionTerminal());
            }

            if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                //Verificamos si existe algun detalle que fue eliminado
                List<SistemaControlCompDetaDto> lstDetallesAux = detaManager.obtenerHijosPorEmpresa(dto);
                for (SistemaControlCompDetaDto i : lstDetallesAux) {
                    boolean isDeletable = true;
                    for (SistemaControlCompDetaDto j : lstDetalles) {
                        if (j.getId() != null) {
                            if (i.equals(j)) {
                                isDeletable = false;
                            }
                        }
                    }
                    if (isDeletable) {
                        detaManager.eliminar(i);
                    }
                }
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = "";//retroceder();
            }

//            } else {
//                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
//                recursosManager.showError(mensajeTrx);
//                to = null;
//            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);
            to = null;
        }
        return to;
    }

    public void conformidad(SistemaControlCompDetaDto dtoForm) {
        try {
            System.out.println("en metodo conformidad manager");
            SistControlConformidadManager sistControlConformidadManager = (SistControlConformidadManager) WebServletContextListener.getApplicationContext().getBean("sistControlConformidadManager");
            sistControlConformidadManager.guardar(dtoForm);
            verificarCambioEstado(dtoForm);
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex);
            System.out.println(ex.getMessage());
        }
    }

    public void verificarCambioEstado(SistemaControlCompDetaDto dtoForm) {
        try {
            System.out.println("en metodo verificar cambio estado manager");
            boolean indicador = true;
            boolean indicadorNoObligatorios = false;
            boolean indicadorAlmenosUno = false;
            System.out.println("transaccion --> " + dtoForm.getSistemaControlCompDto().getTransaccion());
            System.out.println("estado transaccion --> " + dtoForm.getSistemaControlCompDto().getEstadoTransaccion());
            System.out.println("id transaccion --> " + dtoForm.getIdTrasaccion());
            List<SistemaControlCompDetaDto> lst = detaManager.cargarEncargadosParaPopup(dtoForm.getSistemaControlCompDto().getTransaccion(), dtoForm.getSistemaControlCompDto().getEstadoTransaccion(), dtoForm.getIdTrasaccion());
            System.out.println("LST --> " + lst.size());
            for (SistemaControlCompDetaDto x : lst) {
                System.out.println("OBL --> " + x.getObligatorio());
                System.out.println("CONF --> " + x.getConformidad());
                if (x.getObligatorio()) {
                    if (!x.getConformidad()) {
                        indicador = false;
                    }
                    indicadorNoObligatorios = true;
                } else {
                    if (x.getConformidad()) {
                        indicadorAlmenosUno = true;
                    }
                }
            }

            if (indicadorNoObligatorios) {//Si al menos existe un obligatorio
                if (indicador) {//Todos tienen conformidad
                    //Procedemos al cambio de estado
                    cambioDeEstado(dtoForm, true);
                } else {
                    //Simplemente enviamos el formulario a edicion
                    cambioDeEstado(dtoForm, false);
                }
            } else {//Si no existe ni un obligatorio
                if (indicadorAlmenosUno) {//Y al menos uno ha sido atendido
                    //Procedemos al cambio de estado
                    cambioDeEstado(dtoForm, true);
                } else {
                    //Simplemente enviamos el formulario a edicion
                    cambioDeEstado(dtoForm, false);
                }

            }
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex);
            System.out.println(ex.getMessage());
        }
    }

    public void cambioDeEstado(SistemaControlCompDetaDto dtoForm, boolean indicadorCambio) {
        try {            
            SolicitudCompraMBean solicitudCompraMBean = (SolicitudCompraMBean) WebServletContextListener.getApplicationContext().getBean("solicitudCompraMBean");
            PedidoCompraMBean pedidoCompraMBean = (PedidoCompraMBean) WebServletContextListener.getApplicationContext().getBean("pedidoCompraMBean");
            DocumentoCompraMBean documentoCompraMBean = (DocumentoCompraMBean) WebServletContextListener.getApplicationContext().getBean("documentoCompraMBean");
            ComprobanteCompraMBean comprobanteCompraMBean = (ComprobanteCompraMBean) WebServletContextListener.getApplicationContext().getBean("comprobanteCompraMBean");
            if (dtoForm.getSistemaControlCompDto().getTransaccion() == ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_SOLICITUD) {
                //solicitudCompraMBean.setDto(solicitudCompraManager.obtenerPorId(dtoForm.getIdTrasaccion()));
                if (indicadorCambio) {
                    if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.SOL_COMPRA_COD_ESTADO_RECHAZADA)) {
                        solicitudCompraMBean.rechazar();
                    } else if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.SOL_COMPRA_COD_ESTADO_CONFIRMADA)) {
                        solicitudCompraMBean.confirmar();
                    } else if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.SOL_COMPRA_COD_ESTADO_ANULADA)) {
                        solicitudCompraMBean.anular();
                    }
                } else {
                    recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("sist.control.mensaje.conformidad"));
                    solicitudCompraMBean.editar();
                }
            } else if (dtoForm.getSistemaControlCompDto().getTransaccion() == ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_PEDIDO) {
                //pedidoCompraMBean.setDto(pedidoCompraManager.obtenerPorId(dtoForm.getIdTrasaccion()));
                if (indicadorCambio) {
                    if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_RECHAZADO)) {
                        pedidoCompraMBean.rechazar();
                    } else if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO)) {
                        pedidoCompraMBean.confirmar();
                    } else if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ANULADO)) {
                        pedidoCompraMBean.anular();
                    }
                } else {
                    recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("sist.control.mensaje.conformidad"));
                    pedidoCompraMBean.editar();
                }
            } else if (dtoForm.getSistemaControlCompDto().getTransaccion() == ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_DOCUMENTO) {
                //documentoCompraMBean.setDto(documentoCompraManager.obtenerPorId(dtoForm.getIdTrasaccion()));
                if (indicadorCambio) {
                    if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_CONFIRMADO)) {
                        documentoCompraMBean.confirmar();
                    } else if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ANULADO)) {
                        documentoCompraMBean.anular();
                    }
                } else {
                    recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("sist.control.mensaje.conformidad"));
                    documentoCompraMBean.editar();
                }
            } else if (dtoForm.getSistemaControlCompDto().getTransaccion() == ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_COMPROBANTE) {
                //comprobanteCompraMBean.setDto(comprobanteCompraManager.obtenerPorId(dtoForm.getIdTrasaccion()));
                if (indicadorCambio) {
                    if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_CONFIRMADO)) {
                        comprobanteCompraMBean.confirmar();
                    } else if (dtoForm.getSistemaControlCompDto().getEstadoTransaccion().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ANULADO)) {
                        comprobanteCompraMBean.anular();
                    }
                } else {
                    recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("sist.control.mensaje.conformidad"));
                    comprobanteCompraMBean.editar();
                }
            }
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex);
            System.out.println(ex.getMessage());
        }
    }

    public SelectItem[] siTipoDeta() {
        SelectItem[] si = new SelectItem[2];
        si[0] = new SelectItem(ConstantesComp.ValoresConstantes.SIST_CONTROL_DETA_COD_USUARIO, ConstantesComp.ValoresConstantes.SIST_CONTROL_DETA_DESC_USUARIO);
        si[1] = new SelectItem(ConstantesComp.ValoresConstantes.SIST_CONTROL_DETA_COD_ROL, ConstantesComp.ValoresConstantes.SIST_CONTROL_DETA_DESC_ROL);
        return si;
    }

    public void nuevoMuchos(List<SistemaControlCompDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<SistemaControlCompDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        SistemaControlCompManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<SistemaControlCompDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<SistemaControlCompDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }
}
